package com.stsdai.manager.service.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.stsdai.manager.mapper.ContentCategoryMapper;
import com.stsdai.manager.pojo.ContentCategory;
import com.stsdai.manager.redis.RedisUtils;
import com.stsdai.manager.service.ContentCategoryService;

@Service
public class ContentCategoryServiceImpl extends BaseServiceImpl<ContentCategory> implements ContentCategoryService {

	@Autowired
	private ContentCategoryMapper contentCategoryMapper;

	@Autowired
	private RedisUtils redisUtils;
	
	@Value("${STSDAI_PORTAL_Category}")
	private String STSDAI_PORTAL_Category;

	private static final ObjectMapper objectMapper = new ObjectMapper();
	
	@Override
	public List<ContentCategory> queryContentCategoryByParentId(Long parentId) {
		// 设置查询条件
		ContentCategory param = new ContentCategory();
		param.setParentId(parentId);

		// 执行查询
		List<ContentCategory> list = super.queryListByWhere(param);

		return list;
	}

	@Override
	public ContentCategory saveContentCategory(ContentCategory contentCategory) {
		// 设置内容分类
		contentCategory.setIsParent(false);
		contentCategory.setStatus(1);

		// 执行保存逻辑
		super.save(contentCategory);

		// 查询父节点
		ContentCategory parent = super.queryById(contentCategory.getParentId());

		// 判断父节点是否是叶子节点，就是判断isParent是否为false
		// if(parent.getIsParent()==false)
		if (!parent.getIsParent()) {
			// 如果isParent是为false，需要修改为true
			parent.setIsParent(true);
			// 更新父节点
			super.updateByIdSelective(parent);
		}

		// 返回新增的数据
		return contentCategory;
	}

	@Override
	public void deleteContentCategory(Long parentId, Long id) {
		// 声明List<Object>容器，存放需要删除的节点的id
		List<Object> ids = new ArrayList<>();
		// 把当前要删除的节点id放到容器中
		ids.add(id);

		// 使用递归的方式，获取当前节点的所有的子节点的id，放到ids容器中
		this.getIds(id, ids);

		// 使用父类的方法，批量删除
		super.deleteByIds(ids);

		// 查询当前的节点是否还有兄弟节点
		// 设置查询条件
		ContentCategory param = new ContentCategory();
		param.setParentId(parentId);
		// 执行查询
		int count = super.queryCountByWhere(param);

		// 判断是否还有兄弟节点，判断count是否为0
		if (count == 0) {
			// 如果没有兄弟节点，需要修改父节点的isParent为false
			ContentCategory parent = new ContentCategory();
			parent.setId(parentId);
			parent.setIsParent(false);

			// 更新父节点
			super.updateByIdSelective(parent);
		}
	}

	// 使用递归的方式获取所有的子节点的id
	private void getIds(Long id, List<Object> ids) {
		// 查询当前节点的子节点
		ContentCategory param = new ContentCategory();
		param.setParentId(id);
		List<ContentCategory> list = super.queryListByWhere(param);

		// 在进行递归操作的时候，必须要有递归停止条件
		// 这里的递归停止条件：判断是否有子节点
		if (list.size() != 0) {
			// 如果有子节点，遍历结果集
			for (ContentCategory son : list) {
				// 把子节点的id放到ids容器中
				ids.add(son.getId());
				// 进行递归查询，获取子节点的子
				this.getIds(son.getId(), ids);
			}
		}

	}

	@Override
	public String findAllContentCategory() {

		try {
			// 从缓存中获取数据
			String CategoryJson = this.redisUtils.get("STSDAI_PORTAL_Category");
			// 缓存中是否有数据
			if (StringUtils.isNotBlank(CategoryJson)) {
				// redis中若有数据直接返回
				return CategoryJson;
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		
		// 创建容器存放所有的商品分类信息
		List<Map<String, Object>> result = new ArrayList<>();
		// 设置查询条件
		ContentCategory prarm = new ContentCategory();
		prarm.setStatus(1);
		// 查询获得结果集
		List<ContentCategory> list = super.queryListByWhere(prarm);
		for (ContentCategory category : list) {
			// 把每一个商品分类信息封装在map中
			Map<String, Object> map = new HashMap<>();
			map.put("id", category.getId());
			map.put("parentId", category.getParentId());
			map.put("isParent", category.getIsParent());
			map.put("sortOrder", category.getSortOrder());
			// 把封装好的map放入集合
			result.add(map);
		}
		// 把list转为JSON格式
		String json = "";
		try {
			json = objectMapper.writeValueAsString(result);
		} catch (JsonProcessingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			// 把数据放入缓存
			this.redisUtils.set(STSDAI_PORTAL_Category, json);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}

		// 返回结果
		return json;
	}

}
